package so.obligatorio.generador;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

import javax.xml.bind.JAXB;

import so.obligatorio.modelo.Escenario;
import so.obligatorio.modelo.Espectaculo;
import so.obligatorio.modelo.FormaPago;
import so.obligatorio.procesos.Cliente;

public class Generador {
	Escenario escenario	= null;
	Cliente cliente		= null;
	private List<String> cedulas	= new ArrayList();



	//Devuelve una lista de strings con formato '1.222.333-4'
	private List<String> GenerarCi (Integer cantidad){
		for (int i = 0; i< cantidad; i++){
			String ci="";
			for (int j = 0; j<8; j++){
				Integer digito = new Random().nextInt(9);	
				if (j==1 || j==4){
					ci += "."+digito.toString();
				}
				else if(j==7){
					ci += "-"+digito.toString();
				}
				else{
					ci += digito.toString();
				}
			}
			if (!cedulas.contains(ci)){
				cedulas.add(ci);
			}
			else{
				i -=1;
			}

		}
		return cedulas;
	}
	
	private void crearArchivo(Escenario escenario, Integer numEscenario){
		
		OutputStream salida;
		try {
			salida = new FileOutputStream("escenarios/Escenario-"+numEscenario.toString()+".xml");
			JAXB.marshal(escenario, salida);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}


	public void GenerarescenarioUno(int cantClientes, int cantBoleterias, int cantRedCobranza, Espectaculo espectaculo){
		
		escenario = new Escenario();
		Cliente cliente;
		
		List<Cliente> listaClientes = new ArrayList();
		this.GenerarCi(cantClientes+1);

		int clientesPref = Math.round((float) (cantClientes/2));
		cantClientes -= clientesPref;

		for (int i=0; i<=clientesPref; i++){
			int cantidadSolicitada = new Random().nextInt(4)+1;
			cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, true);
			listaClientes.add(cliente);


		}
		for (int i=0; i<cantClientes; i++){
			Boolean esEmpresa = new Random().nextBoolean();
			if (esEmpresa){
				
				int cantidadSolicitada = new Random().nextInt(150) + 40;
				cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, false);
				listaClientes.add(cliente);

			}
			else {
				Boolean esPreferencial = new Random().nextBoolean();
				int cantidadSolicitada = new Random().nextInt(4)+1;
				if (esPreferencial){
					cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.TARJETA_CON_PREFERENCIA, false);					
					listaClientes.add(cliente);
				}
				else{
					cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, false);
					listaClientes.add(cliente);
				}
				

			}
		}

		Collections.shuffle(listaClientes);
		escenario.setCantBoleteriasEspectaculo(cantBoleterias);
		escenario.setCantBoleteriasRedCobranza(cantRedCobranza);
		escenario.setEspectaculo(espectaculo);
		escenario.setClientes(listaClientes);
		this.crearArchivo(escenario, 1);

	}

	
	
	public void GenerarescenarioDos(int cantClientes, int cantBoleterias, int cantRedCobranza, Espectaculo espectaculo){

		escenario = new Escenario();
		Cliente cliente;
		
		List<Cliente> listaClientes = new ArrayList();
		this.GenerarCi(cantClientes+1);
		
		int clientesPref = Math.round((float) (cantClientes/2));
		cantClientes -= clientesPref;

		for (int i=0; i<=clientesPref; i++){
			int cantidadSolicitada = new Random().nextInt(4)+1;
			cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.TARJETA_CON_PREFERENCIA, false);
			listaClientes.add(cliente);


		}
		for (int i=0; i<cantClientes; i++){

			Boolean esEmpresa = new Random().nextBoolean();
			Boolean esDiscapacitado = new Random().nextBoolean();
			if (esEmpresa){
				int cantidadSolicitada = new Random().nextInt(150) + 40;
				cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, false);
				listaClientes.add(cliente);
			}

			else if(esDiscapacitado){
				int cantidadSolicitada = new Random().nextInt(4)+1;
				cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, esDiscapacitado);
				listaClientes.add(cliente);
			}
			else {
				int cantidadSolicitada = new Random().nextInt(4)+1;
				cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, esDiscapacitado);
				listaClientes.add(cliente);
			}
			
		}

		Collections.shuffle(listaClientes);
		escenario.setCantBoleteriasEspectaculo(cantBoleterias);
		escenario.setCantBoleteriasRedCobranza(cantRedCobranza);
		escenario.setEspectaculo(espectaculo);
		escenario.setClientes(listaClientes);
		
		this.crearArchivo(escenario, 2);


	}
	
	public void GenerarescenarioTres(int cantClientes, int cantBoleterias, int cantRedCobranza, Espectaculo espectaculo){

		escenario = new Escenario();
		Cliente cliente;
		
		List<Cliente> listaClientes = new ArrayList();
		this.GenerarCi(cantClientes+1);
		int clientesPref = Math.round((float) (cantClientes/2));
		cantClientes -= clientesPref;

		for (int i=0; i<=clientesPref; i++){
			int cantidadSolicitada = new Random().nextInt(150) + 40;
			cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, false);
			listaClientes.add(cliente);


		}
		for (int i=0; i<cantClientes; i++){
			Boolean esDiscapacitado = new Random().nextBoolean();
			int cantidadSolicitada = new Random().nextInt(4)+1;
			if (esDiscapacitado){
				cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, esDiscapacitado);
				listaClientes.add(cliente);
			}
			else {
				Boolean esPreferencial = new Random().nextBoolean();
				if (esPreferencial){
					cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.TARJETA_CON_PREFERENCIA, esDiscapacitado);
					listaClientes.add(cliente);
				}
				else{
				cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, esDiscapacitado);
				listaClientes.add(cliente);
				}
			}
		}

		Collections.shuffle(listaClientes);
		escenario.setCantBoleteriasEspectaculo(cantBoleterias);
		escenario.setCantBoleteriasRedCobranza(cantRedCobranza);
		escenario.setEspectaculo(espectaculo);
		escenario.setClientes(listaClientes);
		this.crearArchivo(escenario, 3);

	}
	
	public void GenerarescenarioReal(int cantClientes, int cantBoleterias, int cantRedCobranza, Espectaculo espectaculo){

		escenario = new Escenario();
		Cliente cliente;
		this.GenerarCi(cantClientes+1);
		List<Cliente> listaClientes = new ArrayList();
		
		int otrosCompradores = (int) (cantClientes*0.6);
		
		int grandesCompradores = (int) (cantClientes*0.20);
		
		int discapacitados = (int) (cantClientes*0.05);
		
		int tarjetasPreferenciales = (int) (cantClientes*0.15);

		for (int i=0; i<=otrosCompradores; i++){
			int cantidadSolicitada = new Random().nextInt(4)+1;
			cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, false);
			listaClientes.add(cliente);
		}
		
		for (int i=0; i< grandesCompradores;i++){
			int cantidadSolicitada = new Random().nextInt(150)+40;
			cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, false);
			listaClientes.add(cliente);
		}
		
		for (int i=0; i< discapacitados;i++){
			int cantidadSolicitada = new Random().nextInt(4)+1;
			cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.EFECTIVO, true);
			listaClientes.add(cliente);
		}
		
		for (int i=0; i< tarjetasPreferenciales;i++){
			int cantidadSolicitada = new Random().nextInt(4)+1;
			cliente = new Cliente(cedulas.remove(cedulas.size()-1), espectaculo.getNombre(), cantidadSolicitada, FormaPago.TARJETA_CON_PREFERENCIA, false);
			listaClientes.add(cliente);
		}
		
		Collections.shuffle(listaClientes);
		escenario.setCantBoleteriasEspectaculo(cantBoleterias);
		escenario.setCantBoleteriasRedCobranza(cantRedCobranza);
		escenario.setEspectaculo(espectaculo);
		escenario.setClientes(listaClientes);
		this.crearArchivo(escenario, 4);

	}
}


